/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MAIN;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Anonymous
 */
public class MAIN extends javax.swing.JFrame {

    /**
     * Creates new form Main
     */
        public static int IDRide;//Đây là biến dùng để lưu mã chuyến xe của 1 chuyến khi mình nhấp vào chuyến đó
                        //có tác dụng khi xóa hoặc cập nhật chuyến xe      
        private int Tickets;//Đây là biến dùng để lưu số lượng vé đã đặt của 1 chuyến khi mình nhấp vào chuyến đó
                        //có tác dụng khi xóa hoặc cập nhật chuyến xe
        private MyTableModel model;//Biến dùng để lưu cấu trúc bảng lưu dữ liệu
        
        //Hàm này sẽ chạy sau khi hàm giao diện thực hiện
    public MAIN() {
        initComponents();
        Tickets=0;//Khởi tạo giá trị cho số vé đã đặt của chuyến xe được chọn là 0
        
        btnUpdate.setEnabled(false);//Không cho nút "cập nhật chuyến xe" xử lý sử kiện nhấp chuột
        btnDelete.setEnabled(false);//Không cho nút "xóa chuyến xe" xử lý sử kiện nhấp chuột
        
        DAO.Connect.ListenServer();//Hàm server dùng để lắng nghe client
        
        //Tạo 1 thread mới dùng làm đồng hồ hiển thị tại nút Time
        new Thread()
        {
            @Override
            public void run()
            {
                boolean fa=false;
             while(true)//Chạy liên tục   
             {
                 Calendar cal=new GregorianCalendar();//Khởi tạo biến này để lưu ngày giờ hiện tại của máy
                 
                 int hour=cal.get(Calendar.HOUR_OF_DAY);//lưu giờ vào biến
                 int min=cal.get(Calendar.MINUTE);//lưu phút vào biến
                 int sec=cal.get(Calendar.SECOND);//lưu giây vào biến
                 int day=cal.get(Calendar.DAY_OF_MONTH);//lưu ngày vào biến
                 int mon=cal.get(Calendar.MONTH);//lưu tháng vào biến
                 int year=cal.get(Calendar.YEAR);//lưu năm vào biến
                 
                 //Đưa thông tin vào chuỗi time
                 String time=hour +":"+min+":"+sec+"    "+day+"-"+(mon+1)+"-"+year;
                 
                 btnTime.setLabel(time);//Thể hiện chuỗi time trên nút Time
                 if(min%30==0)//Mỗi 30 phút kiểm tra và xử lý những đặt vé đã hết hạn thanh toán
                 {
                    new Thread()
                    {
                       @Override
                       public void run()
                       {
                         DAO.DatVeDAO.ktHanDatVe();
                       }
                    }.start();
                 }
             }
            }
        }.start();
        
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    //Phần này là netbeans tự tạo khi mình thiết kế giao diện
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertRide = new java.awt.Button();
        jScrollPane1 = new javax.swing.JScrollPane();
        tbRide = new javax.swing.JTable();
        btnUpdate = new java.awt.Button();
        btnDelete = new java.awt.Button();
        btnRefresh = new java.awt.Button();
        btnTime = new java.awt.Button();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("HTBVTQM_SERVER");

        btnInsertRide.setActionCommand("Insert");
        btnInsertRide.setLabel("Thêm Chuyến Xe");
        btnInsertRide.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnInsertRideActionPerformed(evt);
            }
        });

        model = new MyTableModel();
        tbRide.setAutoCreateRowSorter(true);
        tbRide.setModel(model);
        ListenTable();
        jScrollPane1.setViewportView(tbRide);

        btnUpdate.setLabel("Cập Nhật Chuyến Xe");
        btnUpdate.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnUpdateActionPerformed(evt);
            }
        });

        btnDelete.setLabel("Xóa Chuyến Xe");
        btnDelete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDeleteActionPerformed(evt);
            }
        });

        btnRefresh.setLabel("Làm mới danh sách");
        btnRefresh.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRefreshActionPerformed(evt);
            }
        });

        btnTime.setLabel("Time");
        btnTime.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTimeActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnInsertRide, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(241, 241, 241)
                        .addComponent(btnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 740, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(btnUpdate, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnDelete, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(btnTime, javax.swing.GroupLayout.PREFERRED_SIZE, 268, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(btnTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(14, 14, 14)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnInsertRide, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnDelete, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(20, 20, 20))
        );

        btnInsertRide.getAccessibleContext().setAccessibleName("Insert");

        pack();
    }// </editor-fold>//GEN-END:initComponents

    //Hàm xử lý sử kiện khi nhấp vào nút Thêm chuyến xe
    private void btnInsertRideActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInsertRideActionPerformed
        // TODO add your handling code here:
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                //Ta chạy màn hình ChuyenXeCN trong packet GUI để thêm mới 1 chuyến xe
                new GUI.ChuyenXeCN().setVisible(true);
            }
        });
    }//GEN-LAST:event_btnInsertRideActionPerformed

    //Hàm xử lý sử kiện khi nhấp vào nút Cập nhật chuyến xe
    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnUpdateActionPerformed
        // TODO add your handling code here:
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                //Ta chạy màn hình ChuyenXeCN2 trong packet GUI để cập nhật 1 chuyến xe
                new GUI.ChuyenXeCN2().setVisible(true);
            }
        });
    }//GEN-LAST:event_btnUpdateActionPerformed

    //Hàm xử lý sử kiện khi nhấp vào nút xóa chuyến xe
    private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeleteActionPerformed
        // TODO add your handling code here:
        if(Tickets==0)//Nếu chưa có người đặt vé
        {
            BUS.ChuyenXeBUS cxbus=new BUS.ChuyenXeBUS();//Khởi tạo biến cxbus 
                                                        //xem lại mô hình 3 lớp
                                                        //hoặc vào packet BUS xem chi tiết
            if(cxbus.XoaChuyenXe(IDRide)){//Nếu xóa chuyến xe thành công (chạy hàm xóa chuyến xe trong câu if luôn)
                
                //Show ra màn hình thông báo xóa chuyến xe thành công
                JOptionPane.showMessageDialog(this,
                        "Xóa chuyến xe thành công!",
                        "Thông báo",
                        JOptionPane.INFORMATION_MESSAGE);
            }
            else{
                //Ngược lại show ra màn hình thông báo xóa chuyến xe thất bại
                JOptionPane.showMessageDialog(null,
                        "Xóa chuyến xe thất bại",
                        "Thông báo lỗi",
                        JOptionPane.ERROR_MESSAGE);
            }
            LoadTable();//làm mới lại bảng dữ liệu
        }
        else
        {
            //Ngược lại show ra màn hình thông báo xóa chuyến xe thất bại do đã có người đặt vé
            JOptionPane.showMessageDialog(null,
                        "Không thể xóa chuyến đi do đã có người đặt vé",
                        "Thông báo lỗi",
                        JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnDeleteActionPerformed

    //Hàm xử lý sử kiện khi nhấp vào nút Làm mới danh sách
    private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed
        // TODO add your handling code here:
        LoadTable();//làm mới lại bảng dữ liệu
    }//GEN-LAST:event_btnRefreshActionPerformed

    private void btnTimeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTimeActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_btnTimeActionPerformed
    //Đây là hàm làm mới lại dữ liệu, trả lại true nếu làm mới dữ liệu thành công, ngược lại là false
    private boolean LoadTable(){
        if(DAO.Connect.connect()){//Nếu kết nối được với sql server
            try {
                
                DAO.Connect.con.close();//Đóng kết nối lại
            } catch (SQLException ex) {
                Logger.getLogger(MAIN.class.getName()).log(Level.SEVERE, null, ex);
            }
                model = new MyTableModel();//Tạo mới cấu trúc dùng để lưu bảng dữ liệu
                tbRide.setAutoCreateRowSorter(true);
                tbRide.setModel(model);//Cài đặt cấu trúc đó vào biến bảng dữ liệu
                
                ListenTable();//Nghe sự kiện khi nhấp chuột vào mỗi dòng dữ liệu trong bảng


                jScrollPane1.setViewportView(tbRide);
            
                
                
                btnUpdate.setEnabled(false);//Không cho nút "cập nhật chuyến xe" xử lý sử kiện nhấp chuột
                btnDelete.setEnabled(false);//Không cho nút "xóa chuyến xe" xử lý sử kiện nhấp chuột
                
                return true;
           }
        else{

        }
        return false;
    }
    
    //Hàm nghe sự kiện khi nhấp chuột vào mỗi dòng dữ liệu trong bảng
    private void ListenTable(){
        //Các dòng ở đây là hàm bắt buộc phải có khi lắng nghe, vào tutorial của oracle để thêm chi tiết
        tbRide.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        
        tbRide.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent event) {
    
                        int viewRow = tbRide.getSelectedRow();
                        if (viewRow < 0) {//Nếu không nhấp vào dòng dữ liệu nào
                            //Selection got filtered away.
                            btnUpdate.setEnabled(false);//Không cho nút "cập nhật chuyến xe" xử lý sử kiện nhấp chuột
                            btnDelete.setEnabled(false);//Không cho nút "xóa chuyến xe" xử lý sử kiện nhấp chuột
                        } else {//ngược lại khi nhấp vào 1 dòng dữ liệu chuyến xe
                            
                            //Nếu dòng này không có dòng dữ Da Chay ở cột TT, nghĩa là xe chưa chạy
                            if(!"Da Chay".equals(String.valueOf(tbRide.getValueAt(viewRow, 7)))) {
                                
                                btnUpdate.setEnabled(true);//Cho phép nút Cập nhật chuyến xe xử lý sự kiện nhấp chuột
                                btnDelete.setEnabled(true);//Cho phép nút Xóa chuyến xe xử lý sự kiện nhấp chuột
                                
                                //Lưu mã chuyến xe lại
                                IDRide=Integer.parseInt(String.valueOf(tbRide.getValueAt(viewRow, 0)));
                                
                                //Nếu có chữ FULL ở cột VeDaDat
                                if("FULL".equals(String.valueOf(tbRide.getValueAt(viewRow, 6))))
                                    //Lưu số vé đã đặt ở cột SLVe
                                    Tickets=Integer.parseInt(String.valueOf(tbRide.getValueAt(viewRow, 4)));
                                else//Ngược lại
                                    //Lưu  số vé đã đặt ở cột VeDaDat
                                    Tickets=Integer.parseInt(String.valueOf(tbRide.getValueAt(viewRow, 6)));
                            }
                            else//Ngược lại
                            {
                                btnUpdate.setEnabled(false);//Không cho nút "cập nhật chuyến xe" xử lý sử kiện nhấp chuột
                                btnDelete.setEnabled(false);//Không cho nút "xóa chuyến xe" xử lý sử kiện nhấp chuột
                            }
                        }
                    }
                }
        );
    }
    
    //Đối tượng để lưu dữ liệu cho bảng,tham khảo của oracle
    class MyTableModel extends AbstractTableModel {
        //Đặt tên hiển thị cho các cột
        private String[] columnNames={"MaCX",
                                        "GaBatDau",
                                        "GaKetThuc","ThoiGianChay","SLVe","GHVe","VeDaDat","GiaTien","TT"};; 
        public Object[][] data;//Dùng để chứa dữ liệu
        public MyTableModel(){//Ta chỉ quan tâm đến hàm này, nhiệm vụ đưa dữ liệu vào đối tượng 
            if(DAO.Connect.connect()){//Nếu kết nối thành công với sql server
                try {
                    DAO.Connect.con.close();//Đóng kết nối lại
                } catch (SQLException ex) {
                    Logger.getLogger(MAIN.class.getName()).log(Level.SEVERE, null, ex);
                }
                try
                {   
                    //3 dòng sau làm nhiệm vụ lấy về danh sách tất cả các chuyến xe đưa vào biến Lcxdto
                    BUS.ChuyenXeBUS cxbus=new BUS.ChuyenXeBUS();
                    List<DTO.ChuyenXeDTO> Lcxdto= new ArrayList<DTO.ChuyenXeDTO>();
                    Lcxdto=cxbus.dsChuyenXe();
                    
                    //khai báo du liệu gồm 8 cột và Lcxdto.size()(độ lớn của danh sách chuyến xe) dòng
                    data=new Object[Lcxdto.size()][9];
                    
                    //Lưu định dạng ngày tháng
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd-MM-yyyy");
                    
                    java.util.Date tam=new java.util.Date();//tam lưu ngày giờ hiện tại của máy đang sử dụng
                    
                    int cot=0;//lưu chỉ số cột
                    int dong=0;//lưu chỉ số dòng
                   for(int i=0;i<Lcxdto.size();i++)//Đưa danh sách chuyến xe vào từng dòng và cột
                    {              
                       //bắt đầu từ cột 0 sau đó cộng dần lên
                        data[dong][cot++]=Lcxdto.get(i).getMaChuyen();
                        data[dong][cot++]=Lcxdto.get(i).getGaBatDau();
                        data[dong][cot++]=Lcxdto.get(i).getGaKetThuc();
                        //Định dạng lại kiểu ngày tháng
                        data[dong][cot++]=simpleDateFormat.format(Lcxdto.get(i).getThoiGianChay());
                        
                        data[dong][cot++]=Lcxdto.get(i).getSoLuongVe();                 
                        data[dong][cot++]=Lcxdto.get(i).getGioiHanVe();
                        
                        //Nếu vé đã đặt=số lượng vé thì ghi FULL= đã hết vé vào cột này
                        if(Lcxdto.get(i).getVeDaDat()==Lcxdto.get(i).getSoLuongVe())
                            data[dong][cot++]="FULL";
                        else
                            data[dong][cot++]=Lcxdto.get(i).getVeDaDat();
                        data[dong][cot++]=Lcxdto.get(i).getGiaTien();
                        //Nếu thời gian hiện hành sau thời gian chạy thì ghi Da Chay = Đã chạy vào cột này
                        if(tam.after(Lcxdto.get(i).getThoiGianChay()))
                            data[dong][cot++]="Da Chay";
                        else
                            //Ngược lại ghi Chua Chay= chưa chạy
                            data[dong][cot++]="Chua Chay";
                        
                        cot=0;//gán lại cột =0
                        dong++;// tăng chỉ số dòng lên
                    }
                }
                catch (Exception ex)
                {
                    data=new Object[0][9];
                    System.out.println(ex.getMessage());
                }      
            }
            else
            {
                data=new Object[0][9];
            }

        }
        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        @Override
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        @Override
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            //if (col < 2) {
                return false;//Không cho sữa dữ liệu ngay trên bảng
            //} else {
            //    return true;
            //}
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        @Override
           public void setValueAt(Object value, int row, int col) {
            if (true) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data[row][col] = value;
            fireTableCellUpdated(row, col);

            if (true) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }
    /**
     * @param args the command line arguments
     */
    //đây là file đầu tiên mà chương trình sẽ chạy
    public static void main(String args[]) {//ở đây là hàm đầu tiên mà file này sẽ chạy
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (    ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MAIN.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {//Phần ở trên là do netbeans tự tạo ra nên không cần quan tâm
            @Override
            public void run() {
                if(!DAO.Connect.ktKetNoi()){//Nếu server không thể kết nối với sql server
                    //Ta chạy màn hình cấu hình cho sql server
                            new GUI.ConfigGUI().setVisible(true);//Đây là hàm chạy giao diện, hiểu thêm các bạn google tên hàm
                            }
                            else{
                    //Ngược lại ta chạy màn hình MAIN đã thiết kế cho file này
                                new MAIN().setVisible(true);
                            }
                
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private java.awt.Button btnDelete;
    private java.awt.Button btnInsertRide;
    private java.awt.Button btnRefresh;
    private java.awt.Button btnTime;
    private java.awt.Button btnUpdate;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tbRide;
    // End of variables declaration//GEN-END:variables
}
